﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace DrawingOnForm
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Hàm được triệu gọi khi sự kiện Paint xảy ra
        /// </summary>
        /// <remarks>
        /// Sự kiện Paint xảy ra khi Form chuẩn bị được tô vẽ lại, hiển thị lại
        /// </remarks>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnPaint(object sender, PaintEventArgs e)
        {
            /// - Tạo đối tượng điều khiển đồ họa gdi, tương ứng với form hiện tại
            ///   Do hàm OnPaint được gọi call back từ sự kiện Paint, nên đã có sẵn
            ///   đối tượng PaintEventArgs e, vì vậy đối tượng gdi có thể láy từ đây
            Graphics g = e.Graphics;

            /// - Vẽ một xâu kí tự lên trên Form
            g.DrawString(
                "www.dce.hust.edu.vn",              // Xâu kí tự cần vẽ
                new Font("Arial", 25),              // Font chữ và cỡ chữ
                new SolidBrush(Color.Chocolate),    // Màu chữ, phải dùng bút vẽ Brush
                20, 160                             //  Tọa độ ngang, dọc
            );

            /// -Vẽ đường bao hình chữ nhật trên Form
            g.DrawRectangle(    
                new Pen(Color.Red, 10),             // Màu viền, độ dày của đường thằng, phải dùng bút vẽ Pen
                30, 200,                            // Tọa độ góc trên trái của đường chữ nhật
                40, 80                              // Kích thước
                );

            /// -Vẽ hình chữ nhật trên Form
            g.FillRectangle(
                new SolidBrush(Color.Yellow),                       // Màu chữ, phải dùng bút vẽ Brush
                new Rectangle(new Point(100, 200), new Size(40, 80))// Kích thước hình chữ nhật cần vẽ
                );
        }

        /// <summary>
        /// Hàm được gọi ra khi nút "Vẽ cung tròn" được bấm vào
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonDrawArc_Click(object sender, EventArgs e)
        {
            /// - Tạo bút vẽ
            Pen drawingPen = new Pen(Color.DarkMagenta, 8);
            /// - Tạo đối tượng điều khiển đồ họa gdi, tương ứng với form hiện tại
            ///   Mục tiêu của hàm này không phải để vẽ (không giống hàm OnPaint), nên
            ///   đối tượng gdi không có sẵn, mà phải tự tạo lại từ form.
            Graphics gdi = this.CreateGraphics();
            /// - Vẽ cung tròn
            gdi.DrawArc(drawingPen,    // Bút vẽ
                180, 180,              // Tọa độ góc trên trái
                100, 60,               // Chiều rộng, cao của hình chữ nhật phủ bên ngoài elipse
                20,                    // Góc bắt đầu
                90                     // Góc quét, tính từ góc bắt đầu
                );
            /// - Vẽ dòng chữ 
            gdi.DrawString(
                "Cung tròn và dòng chữ này sẽ biến mất,\nnếu bị một cửa số khác đè lên", // Xâu kí tự cần vẽ
                new Font("Arial", 9),              // Font chữ và cỡ chữ
                new SolidBrush(Color.Chocolate),    // Màu chữ, phải dùng bút vẽ Brush
                150, 260                             //  Tọa độ ngang, dọc
            );

            /// - LƯU Ý: Bắt buộc phải hủy đối tượng gdi sau khi dùng xong.
            gdi.Dispose();  
        }

        /// <summary>
        /// Hàm được gọi ra khi nút "Vẽ lại form" được bấm vào
        /// Hàm sẽ yêu cầu thực thi việc vẽ lại form, tương ứng với việc gọi lại sự kiện Paint
        /// Vì vậy, tất cả những gì được vẽ ngoài sự kiện Paint cũng sẽ bị mất
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonRefresh_Click(object sender, EventArgs e)
        {
            /// - Gửi thông báo rằng Form đã có thay đổi, cần phải vẽ lại Form.
            /// Điều này sẽ khiển sự kiện Paint được kích hoạt.
            Invalidate();
            // - LƯU Ý: Có thể chỉ định Invalidate để chỉ vẽ lại trong một khung 
            //   chữ nhật nào đó, chữ không cần phải toàn bộ form, để nâng cao
            //   hiệu quả xử lý.
        }
    }
}
